import java.util.HashSet;
import java.util.Set;

import org.htmlparser.Node;
import org.htmlparser.NodeFilter;
import org.htmlparser.Parser;
import org.htmlparser.filters.LinkStringFilter;
import org.htmlparser.filters.NodeClassFilter;
import org.htmlparser.filters.OrFilter;
import org.htmlparser.tags.LinkTag;
import org.htmlparser.util.NodeList;
import org.htmlparser.util.ParserException;


public class HtmlParserTool {

	public static Set<String> extractLinks(String url, LinkStringFilter filter) {
		Set<String> links = new HashSet<String> ();
		try {
			Parser parser = new Parser(url);
			parser.setEncoding("gb2312");
			NodeFilter frameFilter = new NodeFilter() {

				@Override
				public boolean accept(Node arg0) {
					// TODO Auto-generated method stub
					if (arg0.getText().startsWith("frame src=")) {
						return true;
					}
					return false;
				}
			};
			
			OrFilter linkFilter = new OrFilter(new NodeClassFilter(LinkTag.class), frameFilter);
			
			NodeList list = parser.extractAllNodesThatMatch(linkFilter);
			for (int i = 0; i < list.size(); i++) {
				Node tag = list.elementAt(i);
				if (tag instanceof LinkTag) {
					if (filter.accept(tag)) {
						LinkTag link = (LinkTag) tag;
						String linkUrl = link.getLink();
						links.add(linkUrl);
					}
				} else {
					if (filter.accept(tag)) {
						String frame = tag.getText();
						int start = frame.indexOf("src=");
						frame = frame.substring(start);
						int end = frame.indexOf(" ");
						if (end == -1) end = frame.indexOf(">");
						String frameUrl = frame.substring(5, end - 1);
						links.add(frameUrl);
					}
				}
			}
		} catch (ParserException e){
			e.printStackTrace();
		}
		return links;
	}
}
